package org.dromara.ai.domain.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * AI聊天请求DTO
 *
 * @author RuoYi
 * @since 2024-01-01
 */
@Data
@Accessors(chain = true)
public class AiChatRequest implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 模型名称
     */
    private String model;

    /**
     * 对话消息列表
     */
    private List<AiMessage> messages;

    /**
     * 温度参数 (0.0-2.0)
     */
    private Double temperature;

    /**
     * 最大生成token数
     */
    private Integer maxTokens;

    /**
     * Top-p参数 (0.0-1.0)
     */
    private Double topP;

    /**
     * 频率惩罚 (-2.0-2.0)
     */
    private Double frequencyPenalty;

    /**
     * 存在惩罚 (-2.0-2.0)
     */
    private Double presencePenalty;

    /**
     * 停止词列表
     */
    private List<String> stop;

    /**
     * 是否流式输出
     */
    private Boolean stream;

    /**
     * 用户ID
     */
    private String userId;

    /**
     * 会话ID
     */
    private String sessionId;

    /**
     * 知识库ID
     */
    private String knowledgeId;

    /**
     * 是否启用知识库检索
     */
    private Boolean enableKnowledge;

    /**
     * 知识库检索数量
     */
    private Integer knowledgeLimit;

    /**
     * 知识库检索阈值
     */
    private Double knowledgeThreshold;

    /**
     * 扩展参数
     */
    private Map<String, Object> extra;

    /**
     * AI消息
     */
    @Data
    @Accessors(chain = true)
    public static class AiMessage implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 消息角色
         */
        private String role;

        /**
         * 消息内容
         */
        private String content;

        /**
         * 消息名称
         */
        private String name;

        /**
         * 函数调用信息
         */
        private Object functionCall;

        /**
         * 工具调用信息
         */
        private List<Object> toolCalls;

        /**
         * 工具调用ID
         */
        private String toolCallId;
    }

    /**
     * 消息角色枚举
     */
    public enum MessageRole {
        SYSTEM("system"),
        USER("user"),
        ASSISTANT("assistant"),
        FUNCTION("function"),
        TOOL("tool");

        private final String value;

        MessageRole(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
}